home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / ACORNUSERS / CBSA / EDUCATION / WIMPPOLL / cc / WimpTask < prev   
Text File  |  1997-12-17  |  3KB  |  123 lines

  1.  
  2. //-----------------------------------
  3. //             WimpTask.c
  4. //-----------------------------------
  5.  
  6.  
  7. #include <string.h>
  8. #include <os.h>
  9. #include <trap.h>
  10. #include "WimpError.h"
  11. #include "WimpTask.h"
  12.  
  13. WimpTask::WimpTask(char *info, int wimp_version, int *message_list)
  14. {
  15.   int r[10];
  16.   os_error *e;
  17.   
  18.   strncpy(taskname, info, 31);
  19.   taskname[31] = 0;
  20.   r[0] = wimp_version;
  21.   r[1] = 'T' +
  22.         ('A' << 8) +
  23.         ('S' << 16) +
  24.         ('K' << 24);
  25.   r[2] = (int) taskname;
  26.   r[3] = (int) message_list;
  27.   if ((e = os_swi (Wimp_Initialise, r)) != NULL) throw(e);
  28.   handle = r[1];
  29.   EnableEvent(ESEND);
  30.   EnableEvent(ESENDWANTACK);
  31. }
  32.  
  33. WimpTask::~WimpTask()
  34. {
  35.   int r[10];
  36.   
  37.   r[0] = handle;
  38.   r[1] = 'T' +
  39.         ('A' << 8) +
  40.         ('S' << 16) +
  41.         ('K' << 24);
  42.   os_swi(Wimp_CloseDown, r);  
  43. }
  44.  
  45. bool WimpTask::load(char *path, int a, int b)
  46. {
  47.   return FALSE;
  48. }
  49.  
  50. bool WimpTask::save(char *path, int &a)
  51. {
  52.   a=0;
  53.   return FALSE;
  54. }
  55.  
  56. bool WimpTask::receive()
  57. {
  58.   int r[10];
  59.   os_error *e;
  60.   bool quit;
  61.   
  62.   switch(User_Message.code)
  63.   { 
  64.     case 0:            // Quit.
  65.       return TRUE;
  66.       break;
  67.     case 2: 
  68.     
  69.       int size;
  70.       quit = save(User_Message.data_load_ack.pathname,size);
  71.       User_Message.your_ref = User_Message.my_ref;
  72.       User_Message.code = 3;
  73.       User_Message.size = size;
  74.       r[0] = (int) ESENDWANTACK;
  75.       r[1] = (int) &User_Message;
  76.       r[2] = User_Message.data_load_ack.dest_window;
  77.       r[3] = User_Message.data_load_ack.icon;
  78.       os_swi(Wimp_SendMessage, r);
  79.       return quit;
  80.       break;
  81.       
  82.     case 3:                    // Load Event.
  83.       User_Message.your_ref = User_Message.my_ref;
  84.       User_Message.code = 4;
  85.       r[0] = (int) ESEND;
  86.       r[1] = (int) &User_Message;
  87.       r[2] = User_Message.task_sender;
  88.       os_swi(Wimp_SendMessage, r);
  89.       quit = load(User_Message.data_load_ack.pathname,
  90.                   User_Message.data_load_ack.size,
  91.                   User_Message.data_load_ack.type);
  92.       return quit;
  93.       break;
  94.     default:
  95.       return FALSE;
  96.       break;
  97.   }  
  98. }
  99.  
  100. void WimpTask::run()
  101. {
  102.   int r[10];
  103.   os_error *e;
  104.   bool quit = 0;
  105.   
  106.   while (!quit)
  107.   {
  108.     r[0] = mask_event;
  109.     r[1] = (int) block;
  110.     if ((e = os_swi(Wimp_Poll, r)) != NULL) throw (e);
  111.     
  112.     switch (r[0])
  113.     {
  114.       case ENULL :     quit = NullEvent();    break;
  115.       case EREDRAW :     quit = RedrawWindow();    break;
  116.       case EOPEN:    quit = OpenWindow();    break;
  117.       case ECLOSE:    quit = CloseWindow();    break;
  118.       case ESEND:    quit = receive();    break;
  119.       case ESENDWANTACK: quit = receive();    break;
  120.     }
  121.   }
  122. }
  123.